﻿<?php
/*
  FUSIONCHARTS FREE API PHP CLASS
  Author  :  Infosoft Global Pvt. Ltd.
  version :  FREE
  Company :  Infosoft Global Pvt. Ltd.

 *  Version: 1.0.1 (11 December 2008) [ Fix PHP Short Tag, Function addDatasetsFromDatabase 
 *                                    Modifiaction for Transposed ,
 *                                    Fix Transparent setting, FusionCharts.php insight Code  
 *                                    setInitParam Function Add, addColors Function Add,
 *                                    encodeXMLChars Function Add ]

  FusionCharts Class easily handles All FusionCharts XML Structures like
  graph, categories, dataset, set, Trend Lines, [vline, styles (for Future)] etc.
  It’s easy to use, it binds data into FusionCharts XML Structures

 */

class FusionCharts {

    var $chartType;               # Chart Friendly Name
    var $chartID;      # ID of the Chart for JS interactivity(optional)
    var $SWFFile;       # Name of the required FusionCharts SWF file 
    var $SWFPath;                 # relative path of FusionCharts SWF files
    var $width;                   # FusionCharts width
    var $height;                  # FusionCharts height
    # attribute Delimiter
    var $del;

    # Chart XML string 
    var $strXML;

    # Chart Series Types : 1 => single series, 2=> multi-series, 5=>Gantt (
    # For Future Use : 3=> scatter and bubble, 4=> MSStacked
    var $seriesType;

    # Charts Atribute array 
    var $chartParams = array();     #List of Chart Parameters
    var $chartParamsCounter;  #Number of Chart parameters
    var $categoriesParam;           # Categories Parameter Setting 
    var $categoryNames = array();   # Category array for storing Category set
    var $categoryNamesCounter;      # Category array counter
    var $dataset = array();         # dataset array
    var $datasetParam = array();    # dataset parameter setting array
    var $datasetCounter;            # dataset array counter
    var $setCounter;                # set array counter 
    # trendLines array
    var $trendLines = array();      # trendLines array
    var $tLineCounter;              # trendLines array counter
    #chart messages
    var $chartMSG;
    var $chartSWF = array();  # Charts SWF array
    var $arr_FCColors = array();  # Color Set to be applied to dataplots
    var $UserColorON;               # User define color define true or false
    var $userColorCounter;
    // Cache Control
    var $noCache;
    var $DataBaseType;             # DataBase Type
    var $encodeChars;               # XML for dataXML or dataURL
#############============ For Gantt Chart  ============================
    # Gantt categories
    var $GT_categories = array();
    var $GT_categories_Counter;
    var $GT_categoriesParam = array();
    var $GT_subcategories_Counter;

    # Gantt processes
    var $GT_processes = array();
    var $GT_processes_Counter;
    var $GT_processes_Param;

    # Gantt Tasks
    var $GT_Tasks = array();
    var $GT_Tasks_Counter;
    var $GT_Tasks_Param;

    # Gantt Connectors
    var $GT_Connectors = array();
    var $GT_Connectors_Counter;
    var $GT_Connectors_Param;

    # Gantt Milestones
    var $GT_Milestones = array();
    var $GT_Milestones_Counter;
    var $GT_Milestones_Param;

    # Gantt datatable
    var $GT_datatable = array();
    var $GT_datatable_Counter;
    var $GT_datatableParam;
    var $GT_dataColumnParam = array();
    var $GT_subdatatable_Counter;

    #------- For Futute Use (start)----------------	
    # Gantt legend
    var $GT_legend = array();
    var $GT_legend_Counter;
    var $GT_legend_Param;
    #------- For Futute Use (end)----------------
    var $wMode;

    # Advanced Chart settings
    var $JSC = array();

#############============ For Future Use (start)============================
    # dataset for MSStackedColumn2D
    var $MSSDataset = array();       # dataset array for MSStackedColumn2D
    var $MSSDatasetParams = array();  # MSSDataset parameter setting
    var $MSSDatasetCounter;          # MSSDataset array counter
    var $MSSSubDatasetCounter;       # ms sub dataset array counter
    var $MSSSetCounter;              # msset array counter
    # lineset 
    var $lineSet = array();         # lineSet array
    var $lineSetParam = array();    # lineSet Parameter setting array
    var $lineCounter;               # line array counter 
    var $lineSetCounter;            # lineset array counter
    var $lineIDCounter;             # lineID counter;
    # vtrendLines array
    var $vtrendLines = array();     # vtrendLines array
    var $vtLineCounter;             # vtrendLines array counter
    # style array
    var $styles = array();           # styles array
    var $styleDefCounter;                # define counter
    var $styleAppCounter;                # apply counter

#############============ For Future Use (end)============================
    # FusionCharts Constructor, its take 4  Parameters.
    # when we create object of FusionCharts, then Constructor will auto run and initialize 
    # chats array parameter like chartType, width, height, chartsID

    function FusionCharts($chartType="column2d", $width="400", $height="300", $chartID="", $isTransparent="") {

        $this->wMode = $isTransparent;
        # Setting All Charts Array
        $this->setChartArrays();

        #initialise colorList
        $this->colorInit();

        # Setting Chart name
        $this->chartType = strtolower($chartType);
        # Getting Charts Series Type
        $this->getSeriesType();

        # Setting Charts Width and Height
        $this->width = $width;
        $this->height = $height;

        # Setting ChartID, Defult is Charts Name
        if ($chartID == "") {
            $chartCounter = @$_SESSION['chartcount'];
            if ($chartCounter <= 0 || $chartCounter == NULL) {
                $chartCounter = 1;
            }

            $this->chartID = $chartType . $chartCounter;
            $_SESSION['chartcount'] = ++$chartCounter;
        } else {
            $this->chartID = $chartID;
        }

        # Setting Defult Parameter Delimiter  to ';'
        $this->del = ";";

        # Setting Default SWF Path
        $this->SWFPath = "";
        $this->SWFFile = $this->SWFPath . "FCF_" . $this->chartSWF[$this->chartType][0] . ".swf";
        # Initialize categoriesParam 
        $this->categoriesParam = "";
        $this->categoryNamesCounter = 1;

        # Creating Category Array
        $this->createCategory($this->categoryNamesCounter);

        # Initialize Dataset Variables
        $this->datasetCounter = 0;
        $this->setCounter = 0;
        if ($this->seriesType > 1) {
            $this->setCounter++;
        }

        # Initialize  MSSDataset Variables
        if ($this->seriesType == 4) {
            $this->MSSDatasetCounter = 0;
            $this->MSSSubDatasetCounter = 0;
            $this->MSSSetCounter = 0;

            $this->lineCounter = 0;
            $this->lineSetCounter = 0;
            $this->lineIDCounter = 0;
        }

        # vTrendLines Array inisialize
        if ($this->seriesType == 3) {
            $this->vtLineCounter = 1;
            $this->createvTrendLines($this->vtLineCounter);
        }

        # TrendLines Array inisialize
        $this->tLineCounter = 1;
        $this->createTrendLines($this->tLineCounter);

        # Styles Array inisialize
        $this->styleDefCounter = 1;
        $this->styleAppCounter = 1;
        $this->createStyles("definition");
        $this->createSubStyles("definition", "style");
        $this->createSubStylesParam("definition", "style", $this->styleDefCounter);

        $this->GT_categories_Counter = 0;
        $this->GT_subcategories_Counter = 0;

        $this->GT_processes_Counter = 0;
        $this->GT_processes_Param = "";

        $this->GT_Tasks_Counter = 0;
        $this->GT_Tasks_Param = "";

        # Gantt Connectors
        $this->GT_Connectors_Counter = 0;
        $this->GT_Connectors_Param = "";

        # Gantt datatable
        $this->GT_datatable_Counter = 0;
        $this->GT_datatableParam = "";
        $this->GT_subdatatable_Counter = 0;

        # Gantt legend
        $this->GT_legend_Counter = 0;
        $this->GT_legend_Param = "";

        $this->chartMSG = "";
        # XML store Variables 
        $this->strXML = "";

        $this->UserColorON = false;
        $this->userColorCounter = 0;

        $this->noCache = false;
        $this->DataBaseType = "mysql";

        // JS Constructor
        $this->JSC["debugmode"] = false;       # debugmode default is false
        $this->JSC["registerwithjs"] = false;  # registerwithJS default is false
        $this->JSC["bgcolor"] = "";            # bgcolor default not set
        $this->JSC["scalemode"] = "noScale";   # scalemode default noScale
        $this->JSC["lang"] = "EN";             # Language default EN
        // dataXML type encode
        $this->encodeChars = true;
    }

##------------ PUBLIC FUNCTIONS ----------------------------------------------------------------
    # Special Character

    function encodeXMLChars($option=true) {
        $this->$encodeChars = $option;
    }

    # Setting Parameter Delimiter, Defult Parameter Separator is ";"

    function setParamDelimiter($strDel) {
        $this->del = $strDel;
    }

    # Database type set like ORACLE and MYSQL

    function setDataBaseType($dbType) {
        $this->DataBaseType = strtolower($dbType);
    }

    # Setting path of SWF file. file name like FCF_Column3D.swf. where FCF_ is common for all SWF file

    function setSWFPath($SWFPath) {
        $this->SWFPath = $SWFPath;
        $this->SWFFile = $this->SWFPath . "FCF_" . $this->chartSWF[$this->chartType][0] . ".swf";
    }

    # We can add or change single Chart parameter by setChartParam function
    # its take Parameter Name and its Value

    function setChartParam($paramName, $paramValue) {
        $this->chartParams[$paramName] = $this->encodeSpecialChars($paramValue);
    }

    # We can add or change Chart parameter sets by setChartParams function
    # its take parameterset [ caption=xyz caption;subCaption=abcd abcd abcd;xAxisName=x axis;yAxisName=y's axis;bgColor=f2fec0;animation=1 ]
    # Defult Parameter Separator is ";"

    function setChartParams($strParam) {
        $listArray = explode($this->del, $strParam);
        foreach ($listArray as $valueArray) {
            $paramValue = explode("=", $valueArray, 2);
            if ($this->validateParam($paramValue) == true) {
                $this->chartParams[$paramValue[0]] = $this->encodeSpecialChars($paramValue[1]);
            }
        }
    }

    # Setting Categories Parameter into categoriesParam variables

    function setCategoriesParams($strParam) {

        $this->categoriesParam .= $this->ConvertParamToXMLAttribute($strParam);
    }

    # Function addCategoryFromDatabase adding Category from dataset

    function addCategoryFromDatabase($query_result, $categoryColumn) {
        if ($this->DataBaseType == "mysql") {
            # fetching recordset till eof
            while ($row = mysql_fetch_array($query_result)) {
                # add category
                $this->addCategory($row[$categoryColumn], "", "");
            }
        } elseif ($this->DataBaseType == "oracle") {
            # fetching recordset till eof
            while (OCIFetchInto($query_result, $row, OCI_ASSOC)) {
                # add category
                $this->addCategory($row[$categoryColumn], "", "");
            }
        }
    }

    # Function addCategoryFromArray adding Category from Array

    function addCategoryFromArray($categoryArray) {
        # convert array to category set
        foreach ($categoryArray as $value) {
            # adding category
            $this->addCategory($value);
        }
    }

    # Function for create set and catagory, dataset , set from array

    function addChartDataFromArray($dataArray, $dataCatArray="") {
        if (is_array($dataArray)) {
            if ($this->seriesType == 1) {
                # Single series Array
                # aa[..][..]="name" aa[..][..]="value"
                foreach ($dataArray as $arrayvalue) {
                    if (is_array($arrayvalue)) {
                        $this->addChartData($arrayvalue[1], "name=" . $arrayvalue[0]);
                    }
                }
            } else {
                # Multi series Array
                if (is_array($dataCatArray)) {
                    foreach ($dataCatArray as $value) {
                        $this->addCategory($value);
                    }
                }
                foreach ($dataArray as $arrayvalue) {
                    if (is_array($arrayvalue)) {
                        $i = 0;
                        $aaa[0] = "";
                        $aaa[1] = "";
                        foreach ($arrayvalue as $value) {
                            if ($i >= 2) {
                                $this->addChartData($value);
                            } else {
                                $aaa[$i] = $value;
                            }
                            if ($i == 1) {
                                $this->addDataset($aaa[0], $aaa[1]);
                            }
                            $i++;
                        }
                    }
                }
            }
        }
    }

    # Function addCategory adding Category and vLine element

    function addCategory($label="", $catParam="", $vlineParam = "") {
        $strCatXML = "";
        $strParam = "";
        $label = $this->encodeSpecialChars($label);
        # cheking vlineParam equal blank
        if ($vlineParam == "") {
            # cheking catParam not blank
            if ($catParam != "") {

                $strParam = $this->ConvertParamToXMLAttribute($catParam);
            }
            # adding label and parameter set to category 
            $strCatXML = "<category name='" . $label . "' " . $strParam . " />";
        } else {

            $strParam = $this->ConvertParamToXMLAttribute($vlineParam);

            # adding parameter set to vLine
            $strCatXML = "<vLine " . $strParam . "  />";
        }
        # storing into categoryNames array
        $this->categoryNames[$this->categoryNamesCounter] = $strCatXML;
        # Increase Counter
        $this->categoryNamesCounter++;
    }

    # adding dataset array element

    function addDataset($seriesName, $strParam="") {
        $this->datasetCounter++;
        $this->createDataset($this->datasetCounter);

        $this->setCounter++;
        $this->createDataValues($this->datasetCounter, "_" . $this->setCounter);

        $seriesName = $this->encodeSpecialChars($seriesName);
        # creating seriesName and dataset parameter set
        $tempParam = "";
        $tempParam = "seriesName='" . $seriesName . "' ";
        $tempParam .= $this->ConvertParamToXMLAttribute($strParam);

        $colorParam = "";
        $pos = strpos(strtolower($tempParam), " color");
        if ($pos === false) {
            $colorParam = " color='" . $this->getColor($this->datasetCounter - 1) . "'";
        }

        # setting  datasetParam array
        $this->datasetParam[$this->datasetCounter] = $tempParam . $colorParam;
    }

    # Function addChartData adding set data element

    function addChartData($value="", $setParam="", $vlineParam = "") {
        $strSetXML = "";

        # Choosing dataset depend on seriesType and getting XML set
        if ($this->seriesType >= 1 and $this->seriesType <= 2) {

            $strSetXML = $this->setSSMSDataArray($value, $setParam, $vlineParam);
        } elseif ($this->seriesType == 3) {

            $strSetXML = $this->setScatterBubbleDataArray($value, $setParam, $vlineParam);
        } elseif (($this->seriesType == 4)) {

            $strSetXML = $this->setSSMSDataArray($value, $setParam, $vlineParam);
        }

        # Adding xml set to dataset array and Increase set counter
        if ($this->seriesType == 1) {
            $this->dataset[$this->setCounter] = $strSetXML;
            $this->setCounter++;
        } elseif ($this->seriesType > 1 and $this->seriesType < 4) {
            $this->dataset[$this->datasetCounter]["_" . $this->setCounter] = $strSetXML;
            $this->setCounter++;
        } elseif ($this->seriesType == 4) {
            $this->MSSDataset[$this->MSSDatasetCounter][$this->MSSSubDatasetCounter][$this->MSSSetCounter] = $strSetXML;
            $this->MSSSetCounter++;
        }
    }

    # The addDatasetsFromDatabase() function adds dataset and set elements from -
    # database, by Default, from MySql recordset. You can use setDatabaseType() function -
    # to set the type of database to work on.

    function addDatasetsFromDatabase($query_result, $ctrlField, $valueField, $datsetParamArray="", $link="") {

        # Initialize variables
        $paramset = "";
        $tempContrl = "";
        if (is_array($datsetParamArray) == false) {
            $datsetParamArray = array();
        }

        # Calculate total no of array elements in datsetParamArray
        $arrLimit = count($datsetParamArray);
        $i = 1;
        $tempParam = "";
        if ($this->DataBaseType == "mysql") {
            ##### For My SQL Connection
            $FieldArray = explode($this->del, $valueField);
            if (count($FieldArray) > 1) {
                ### Muli Series
                # fetching recordset
                while ($row = mysql_fetch_array($query_result)) {
                    # Add Category
                    $this->addCategory($row[$ctrlField]);
                }

                $k = 0;
                # Add daatset for multiple fields
                foreach ($FieldArray as $FieldName) {

                    if ($k < $arrLimit) {
                        $tempParam = $datsetParamArray[$k];
                    } else {
                        $tempParam = "";
                    }
                    # Add Dataset with adddataset() function
                    $this->addDataset($FieldName, $tempParam);

                    # rewind query result
                    mysql_data_seek($query_result, 0);
                    while ($row = mysql_fetch_array($query_result)) {

                        # Generating URL link 
                        if ($link == "") {
                            $paramset = "";
                        } else {
                            # Generating URL link from getLinkFromPattern
                            $paramset = "link=" . urlencode($this->getLinkFromPattern($row, $link));
                        }
                        # add value to dataset
                        $this->addChartData($row[$FieldName], $paramset, "");
                    }
                    $k++;
                }
            } else {

                ### Single Series
                # fetching recordset
                while ($row = mysql_fetch_array($query_result)) {
                    # Creating Control break depending on ctrlField
                    # if ctrlField value changes then dataset will be Generated
                    if ($tempContrl != $row[$ctrlField]) {
                        if ($i <= $arrLimit) {
                            $tempParam = $datsetParamArray[$i - 1];
                        } else {
                            $tempParam = "";
                        }
                        # Add Dataset with adddataset() function
                        $this->addDataset($row[$ctrlField], $tempParam);
                        $tempContrl = $row[$ctrlField];
                        $i++;
                    }
                    # Generating URL link 
                    if ($link == "") {
                        $paramset = "";
                    } else {
                        # Generating URL link from getLinkFromPattern
                        $paramset = "link=" . urlencode($this->getLinkFromPattern($row, $link));
                    }
                    # add value to dataset
                    $this->addChartData($row[$valueField], $paramset, "");
                }
            }
        } elseif ($this->DataBaseType == "oracle") {
            # For Oracle Connection
            # fetching recordset
            while (OCIFetchInto($query_result, $row, OCI_ASSOC)) {
                # Create Control break depending on ctrlField
                # if ctrlField value changes then dataset will be Generated
                if ($tempContrl != $row[$ctrlField]) {
                    if ($i <= $arrLimit) {
                        $tempParam = $datsetParamArray[$i - 1];
                    } else {
                        $tempParam = "";
                    }
                    # add Dataset 
                    $this->addDataset($row[$ctrlField], $tempParam);
                    $tempContrl = $row[$ctrlField];
                    $i++;
                }
                # Generating URL link 
                if ($link == "") {
                    $paramset = "";
                } else {
                    # Generating URL link from getLinkFromPattern
                    $paramset = "link=" . urlencode($this->getLinkFromPattern($row, $link));
                }
                # add value to dataset
                $this->addChartData($row[$valueField], $paramset, "");
            }
        }
    }

    # addDataFromDatabase funcion take 5 parameter like query_result, label field, value field 
    # and initialize dataset variables and link

    function addDataFromDatabase($query_result, $db_field_ChartData, $db_field_CategoryNames="", $strParam="", $LinkPlaceHolder="") {

        $paramset = "";
        if ($this->DataBaseType == "mysql") {
            # fetching recordset till eof
            while ($row = mysql_fetch_array($query_result)) {

                if ($LinkPlaceHolder == "") {
                    $paramset = "";
                } else {
                    # Getting link
                    $paramset = "link=" . urlencode($this->getLinkFromPattern($row, $LinkPlaceHolder));
                }
                if ($strParam = "") {
                    $strParam = $paramset;
                } else {
                    $strParam .= ";" . $paramset;
                }

                # covert to set element and save to $partXML
                if ($db_field_CategoryNames == "") {
                    $data = @$row[$db_field_ChartData];
                    if ($strParam != "")
                        $this->addChartData($this->encodeSpecialChars($data), $strParam);
                    else
                        $this->addChartData($this->encodeSpecialChars($data));
                }
                else {
                    $data = @$row[$db_field_ChartData];
                    $label = @$row[$db_field_CategoryNames];
                    $this->addChartData($this->encodeSpecialChars($data), "name=" . $this->encodeSpecialChars($label) . ";" . $strParam, "");
                }
            }
        } elseif ($this->DataBaseType == "oracle") {
            # fetching recordset till eof
            while (OCIFetchInto($query_result, $row, OCI_ASSOC)) {

                if ($LinkPlaceHolder == "") {
                    $paramset = "";
                } else {
                    # Getting link
                    $paramset = "link=" . urlencode($this->getLinkFromPattern($row, $LinkPlaceHolder));
                }
                if ($strParam = "") {
                    $strParam = $paramset;
                } else {
                    $strParam .= ";" . $paramset;
                }

                # covert to set element and save to $partXML
                if ($db_field_CategoryNames == "") {
                    $data = @$row[$db_field_ChartData];
                    if ($strParam != "")
                        $this->addChartData($this->encodeSpecialChars($data), $strParam);
                    else
                        $this->addChartData($this->encodeSpecialChars($data));
                }
                else {
                    $data = @$row[$db_field_ChartData];
                    $label = @$row[$db_field_CategoryNames];
                    $this->addChartData($this->encodeSpecialChars($data), "name=" . $this->encodeSpecialChars($label) . ";" . $strParam, "");
                }
            }
        }
    }

    # setTLine create TrendLine parameter 

    function addTrendLine($strParam) {

        $listArray = explode($this->del, $strParam);
        foreach ($listArray as $valueArray) {
            $paramValue = explode("=", $valueArray, 2);
            if ($this->validateParam($paramValue) == true) {
                $this->trendLines[$this->tLineCounter][$paramValue[0]] = $this->encodeSpecialChars($paramValue[1]);
            }
        }
        $this->tLineCounter++;
    }

    #this function sets chart messages

    function setChartMessage($strParam) {
        $this->chartMSG = "?";

        $listArray = explode($this->del, $strParam);
        foreach ($listArray as $valueArray) {
            $paramValue = explode("=", $valueArray, 2);
            if ($this->validateParam($paramValue) == true) {
                $this->chartMSG.=$paramValue[0] . "=" . $this->encodeSpecialChars($paramValue[1]) . "&";
            }
        }
        $this->chartMSG = substr($this->chartMSG, 0, strlen($this->chartMSG) - 1);
    }

    #### - This function is mostly for Future USE -----------------------------
    # set JS constructor of FusionCharts.js

    function setAddChartParams($debugMode, $registerWithJS=0, $c="", $scaleMode="", $lang="") {
        $this->JSC["debugmode"] = $debugMode;
        $this->JSC["registerwithjs"] = $registerWithJS;
        $this->JSC["bgcolor"] = $c;
        $this->JSC["scalemode"] = $scaleMode;
        $this->JSC["lang"] = $lang;
    }

    # The function SetInitParam() adds extra chart settings 

    function setInitParam($tname, $tvalue) {

        $trimName = strtolower(str_replace(" ", "", $tname));
        $this->JSC[$trimName] = $tvalue;
    }

    # getXML render all class arrays to XML output

    function getXML() {

        $this->strXML = "";

        $strChartParam = "";


        $strChartParam = $this->getChartParamsXML();
        if ($this->seriesType == 1) {
            if (gettype(strpos($this->chartType, "line")) != "boolean") {
                if (strpos($strChartParam, "lineColor") === false) {
                    $colorSet = $this->getColor(0);
                    $this->setChartParams("lineColor=" . $colorSet);
                }
            }
            if (gettype(strpos($this->chartType, "area")) != "boolean") {
                if (strpos($strChartParam, "areaBgColor") === false) {
                    $colorSet = $this->getColor(0);
                    $this->setChartParams("areaBgColor=" . $colorSet);
                }
            }
        }


        # calling getChartParamsXML function for chart parameter
        $this->strXML = "<graph " . $this->getChartParamsXML() . " >";
        if ($this->seriesType >= 0 and $this->seriesType <= 4) {

            # calling getCategoriesXML function for Category element
            $this->strXML .= $this->getCategoriesXML();
            # calling getDatasetXML function for set element 
            $this->strXML .= $this->getDatasetXML();
            # calling getvTrendLinesXML function for vTrendLines element
            if ($this->seriesType == 3) {
                $this->strXML .= $this->getvTrendLinesXML();
            }
            #  Calling getLinesetXML
            if ($this->seriesType == 4) {
                $this->strXML .= $this->getLinesetXML();
            }
            # calling getTrendLinesXML function for TrendLines element
            $this->strXML .= $this->getTrendLinesXML();
            # calling getStylesXML function for Styles element
            $this->strXML .= $this->getStylesXML();
        } else if ($this->seriesType == 5) {
            $this->strXML .= $this->getGanttCategoriesXML();
            $this->strXML .= $this->getProcessesXML();
            $this->strXML .= $this->getGanttDatatableXML();
            $this->strXML .= $this->getTasksXML();
            $this->strXML .= $this->getConnectorsXML();
            $this->strXML .= $this->getMilestonesXML();
            # calling getTrendLinesXML function for TrendLines element
            $this->strXML .= $this->getTrendLinesXML();
            # calling getStylesXML function for Styles element
            $this->strXML .= $this->getStylesXML();
            $this->strXML .= $this->getLegendXML();
        }

        # Closing Chart element
        $this->strXML .= "</graph>";

        # Return XML output
        return $this->strXML;
    }

    # set wMode

    function setwMode($isTransparent="") {
        $this->wMode = $isTransparent;
    }

    # Function getXML render all class arrays to XML output

    function renderChart($isHTML=false, $display=true) {

        $this->strXML = $this->getXML();
        $this->SWFFile = $this->SWFPath . "FCF_" . $this->chartSWF[$this->chartType][0] . ".swf";

        if ($this->noCache == true) {
            if ($this->chartMSG == "") {
                $this->chartMSG = "?nocache=" . microtime();
            } else {
                $this->chartMSG .= "&nocache=" . microtime();
            }
        }

        # print the charts
        if ($isHTML == false) {
            if ($display) {
                print $this->renderChartJS($this->SWFFile . $this->chartMSG, "", $this->strXML, $this->chartID, $this->width, $this->height, $this->JSC["debugmode"], $this->JSC["registerwithjs"], $this->wMode);
            } else {
                return $this->renderChartJS($this->SWFFile . $this->chartMSG, "", $this->strXML, $this->chartID, $this->width, $this->height, $this->JSC["debugmode"], $this->JSC["registerwithjs"], $this->wMode);
            }
        } else {
            if ($display) {
                print $this->renderChartHTML($this->SWFFile . $this->chartMSG, "", $this->strXML, $this->chartID, $this->width, $this->height, $this->JSC["debugmode"], $this->JSC["registerwithjs"], $this->wMode);
            } else {
                return $this->renderChartHTML($this->SWFFile . $this->chartMSG, "", $this->strXML, $this->chartID, $this->width, $this->height, $this->JSC["debugmode"], $this->JSC["registerwithjs"], $this->wMode);
            }
        }
    }

    # Sets whether chart SWF files are not to be cached 

    function setOffChartCaching($swfNoCache=false) {
        $this->noCache = $swfNoCache;
    }

    # Renders Chart form External XML data source

    function renderChartFromExtXML($dataXML) {
        print $this->renderChartJS($this->SWFFile, "", $dataXML, $this->chartID, $this->width, $this->height, $this->JSC["debugmode"], $this->JSC["registerwithjs"], $this->wMode);
    }

    // RenderChartJS renders the JavaScript + HTML code required to embed a chart.
    // This function assumes that you've already included the FusionCharts JavaScript class
    // in your page.
    // $chartSWF - SWF File Name (and Path) of the chart which you intend to plot
    // $strURL - If you intend to use dataURL method for this chart, pass the URL as this parameter. Else, set it to "" (in case of dataXML method)
    // $strXML - If you intend to use dataXML method for this chart, pass the XML data as this parameter. Else, set it to "" (in case of dataURL method)
    // $chartId - Id for the chart, using which it will be recognized in the HTML page. Each chart on the page needs to have a unique Id.
    // $chartWidth - Intended width for the chart (in pixels)
    // $chartHeight - Intended height for the chart (in pixels)
    // $debugMode - Whether to start the chart in debug mode
    // $registerWithJS - Whether to ask chart to register itself with JavaScript
    // $setTransparent - Transparent mode
    function renderChartJS($chartSWF, $strURL, $strXML, $chartId, $chartWidth, $chartHeight, $debugMode=false, $registerWithJS=false, $setTransparent="") {
        //First we create a new DIV for each chart. We specify the name of DIV as "chartId"Div.			
        //DIV names are case-sensitive.
        // The Steps in the script block below are:
        //
		//  1)In the DIV the text "Chart" is shown to users before the chart has started loading
        //    (if there is a lag in relaying SWF from server). This text is also shown to users
        //    who do not have Flash Player installed. You can configure it as per your needs.
        //
		//  2) The chart is rendered using FusionCharts Class. Each chart's instance (JavaScript) Id 
        //     is named as chart_"chartId".		
        //
		//  3) Check whether to provide data using dataXML method or dataURL method
        //     save the data for usage below 
        $strHTML = "";

        if ($strXML == "")
            $tempData = "\t//Set the dataURL of the chart\n\tchart_$chartId.setDataURL(\"$strURL\");";
        else
            $tempData = "\t//Provide entire XML data using dataXML method\n\tchart_$chartId.setDataXML(\"$strXML\");";

        // Set up necessary variables for the RENDERCHART
        $chartIdDiv = $chartId . "Div";
        $ndebugMode = $this->boolToNum($debugMode);
        $nregisterWithJS = $this->boolToNum($registerWithJS);
        $nsetTransparent = ($setTransparent ? "true" : "false");


        // Create a string for output by the caller

        $strHTML .= "\n<!-- START Script Block for Chart $chartId --> \n\n";

        $strHTML .= "<div id=\"$chartIdDiv\">\n";
        $strHTML .= "\tChart.\n";
        $strHTML .= "</div>\n";
        $strHTML .= "<script type=\"text/javascript\" >\n";
        //Instantiate the Chart	
        $strHTML .= "\tvar chart_$chartId = new FusionCharts(\"$chartSWF\", \"$chartId\", \"$chartWidth\", \"$chartHeight\", \"$ndebugMode\", \"$nregisterWithJS\", \"" . $this->JSC["bgcolor"] . "\",\"" . $this->JSC["scalemode"] . "\",\"" . $this->JSC["lang"] . "\"); \n";

        if ($nsetTransparent == "true") {
            $strHTML .= "\tchart_$chartId.setTransparent(\"$nsetTransparent\");\n";
        }

        $strHTML .= $tempData . "\n";
        //Finally, render the chart.
        $strHTML .= "\tchart_$chartId.render(\"$chartIdDiv\");\n";
        $strHTML .= "</script>\n\n";
        $strHTML .= "<!-- END Script Block for Chart $chartId -->\n";

        return $strHTML;
    }

    //RenderChartHTML function renders the HTML code for the JavaScript. This
    //method does NOT embed the chart using JavaScript class. Instead, it uses
    //direct HTML embedding. So, if you see the charts on IE 6 (or above), you'll
    //see the "Click to activate..." message on the chart.
    // $chartSWF - SWF File Name (and Path) of the chart which you intend to plot
    // $strURL - If you intend to use dataURL method for this chart, pass the URL as this parameter. Else, set it to "" (in case of dataXML method)
    // $strXML - If you intend to use dataXML method for this chart, pass the XML data as this parameter. Else, set it to "" (in case of dataURL method)
    // $chartId - Id for the chart, using which it will be recognized in the HTML page. Each chart on the page needs to have a unique Id.
    // $chartWidth - Intended width for the chart (in pixels)
    // $chartHeight - Intended height for the chart (in pixels)
    // $debugMode - Whether to start the chart in debug mode
    // $registerWithJS - Whether to ask chart to register itself with JavaScript
    // $setTransparent - Transparent mode
    function renderChartHTML($chartSWF, $strURL, $strXML, $chartId, $chartWidth, $chartHeight, $debugMode=false, $registerWithJS=false, $setTransparent="") {
        // Generate the FlashVars string based on whether dataURL has been provided or dataXML.

        $strHTML = "";
        $strFlashVars = "&chartWidth=" . $chartWidth . "&chartHeight=" . $chartHeight . "&debugMode=" . $this->boolToNum($debugMode);

        $strFlashVars .= "&scaleMode=" . $this->JSC["scalemode"] . "&lang=" . $this->JSC["lang"];

        if ($strXML == "")
        // DataURL Mode
            $strFlashVars .= "&dataURL=" . $strURL;
        else
        //DataXML Mode
            $strFlashVars .= "&dataXML=" . $strXML;

        $nregisterWithJS = $this->boolToNum($registerWithJS);
        if ($setTransparent != "") {
            $nsetTransparent = ($setTransparent == false ? "opaque" : "transparent");
        } else {
            $nsetTransparent = "window";
        }

        $strHTML .= "\n<!-- START Code Block for Chart $chartId -->\n\n";

        $HTTP = "http";
        if (strtolower($_SERVER['HTTPS']) == "on") {
            $HTTP = "https";
        }

        $Strval = $_SERVER['HTTP_USER_AGENT'];
        $pos = strpos($Strval, "MSIE");
        if ($pos === false) {

            $strHTML .= "<embed src=\"$chartSWF\" FlashVars=\"$strFlashVars&registerWithJS=$nregisterWithJS\" quality=\"high\" width=\"$chartWidth\" height=\"$chartHeight\" name=\"$chartId\" " . ($this->JSC["bgcolor"] != "") ? " bgcolor=\"" . $this->JSC["bgcolor"] . "\"" : "" . " allowScriptAccess=\"always\"  type=\"application/x-shockwave-flash\"  pluginspage=\"$HTTP://www.macromedia.com/go/getflashplayer\" wmode=\"$nsetTransparent\" \n";
        } else {
            $strHTML .= "<object classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" codebase=\"$HTTP://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0\" width=\"$chartWidth\" height=\"$chartHeight\" id=\"$chartId\"> \n";
            $strHTML .= "\t<param name=\"allowScriptAccess\" value=\"always\" /> \n";
            $strHTML .= "\t<param name=\"movie\" value=\"$chartSWF\" /> \n";
            $strHTML .= "\t<param name=\"FlashVars\" value=\"$strFlashVars&registerWithJS=$nregisterWithJS\" /> \n";
            $strHTML .= "\t<param name=\"quality\" value=\"high\"  /> \n";
            $strHTML .= "\t<param name=\"wmode\" value=\"$nsetTransparent\"  /> \n";
            //Set background color
            if ($this->JSC["bgcolor"] != "") {
                $strHTML .= "\t<param name=\"bgcolor\" value=\"" . $this->JSC["bgcolor"] . "\" /> \n";
            }

            $strHTML .= "</object>\n";
            $strHTML .= "<!-- END Code Block for Chart $chartId -->\n";
        }
        return $strHTML;
    }

    // The function boolToNum() function converts boolean values to numeric (1/0)
    function boolToNum($bVal) {
        return (($bVal == true) ? 1 : 0);
    }

##------------ PRIVATE FUNCTIONS ----------------------------------------------------------------
    # getDatasetXML create set chart xml 

    function getDatasetXML() {
        # Calling dataset function depending on seriesType
        switch ($this->seriesType) {
            case 1 :
                return $this->getSSDatasetXML();
                break;
            case 2 :
                return $this->getMSDatasetXML();
                break;
            case 3 :
                return $this->getMSDatasetXML();
                break;
            case 4 :
                return $this->getMSStackedDatasetXML();
                break;
        }
    }

    # By getChartParamsXML, we can fetch charts array and convert into XML
    # and return like "caption='xyz' xAxisName='x side' ............

    function getChartParamsXML() {
        $partXML = "";
        # feching charts each array and converting into chat parameter
        foreach ($this->chartParams as $part_type => $part_name) {
            $partXML .= $part_type . "='" . $this->encodeSpecialChars($part_name) . "' ";
        }
        # Return Chart Parameter
        return $partXML;
    }

    # Function getCategoriesXML for getting Category part XML

    function getCategoriesXML() {
        if ($this->seriesType > 1) {
            $partXML = "";
            # adding categories parameter
            $partXML = "<categories " . $this->categoriesParam . " >";
            if ($this->categoryNamesCounter > 1) {
                foreach ($this->categoryNames as $part_type => $part_name) {
                    if ($part_name != "") {
                        # adding elements 
                        if ($part_name != "Array") {
                            $partXML .= $part_name;
                        }
                    }
                }
            }
            # Closing <categories>
            $partXML .="</categories>";
            return $partXML;
        }
    }

    # creating single set element
    #       <set value='30' />
    #       <set value='26' />

    function getSSDatasetXML() {
        if ($this->seriesType == 1) {
            $partXML = "";
            foreach ($this->dataset as $part_type => $part_name) {
                if ($part_name != "") {
                    # adding elements 
                    if ($part_name != "Array") {
                        $partXML .= $part_name;
                    }
                }
            }
            return $partXML;
        }
    }

    # getMSDatasetXML for getting datset part XML
    #     <dataset seriesName='Product A' color='AFD8F8' showValues='0'>
    #       <set value='30' />
    #       <set value='26' />
    #     </dataset>

    function getMSDatasetXML() {
        if ($this->seriesType > 1) {
            $partXML = "";
            foreach ($this->dataset as $part_type => $part_name) {
                $partXML .="<dataset  " . $this->datasetParam[$part_type] . " >";
                foreach ($this->dataset[$part_type] as $part_type1 => $part_name1) {
                    if ($part_name1 != "") {
                        # Adding elements 
                        if ($part_name1 != "Array") {
                            $partXML .= $part_name1;
                        }
                    }
                }
                $partXML .="</dataset>";
            }
            return $partXML;
        }
    }

    # getTrendLinesXML create XML output depending on trendLines array
    #  <trendLines>
    #    <line startValue='700000' color='009933' displayvalue='Target' /> 
    # </trendLines>

    function getTrendLinesXML() {
        $partXML = "";
        $lineXML = "";
        # fetching trendLines array
        foreach ($this->trendLines as $l_type => $l_name) {
            # staring line element
            $lineXML .="<line ";
            # fetching trendLines array with in array element
            foreach ($this->trendLines[$l_type] as $part_type => $part_name) {

                $lineXML .= $part_type . "='" . $this->encodeSpecialChars($part_name) . "' ";
            }
            # close line element
            $lineXML .=" />";
        }
        # if line element present then adding $lineXML with in trendLines element 

        $pos = strpos($lineXML, "=");
        if ($pos !== false) {
            $partXML = "<trendLines>" . $lineXML . "</trendLines>";
        } else {
            # return nothing
            $partXML = "";
        }
        # return trendLines xml
        return $partXML;
    }

    # adding set element to dataset element for seriesType 1 and 2

    function setSSMSDataArray($value="", $setParam="", $vlineParam = "") {
        $strSetXML = "";
        $strParam = "";
        $color = 0;
        if ($vlineParam == "") {
            if ($setParam != "") {
                $strParam = $this->ConvertParamToXMLAttribute($setParam);
            }

            $colorSet = "";
            if ($this->UserColorON == true) {
                if ($this->seriesType == 1 && (gettype(strpos($this->chartType, "line")) == "boolean" && gettype(strpos($this->chartType, "area")) == "boolean")) {
                    if (strpos(strtolower($strParam), " color") === false) {
                        $colorSet = " color='" . $this->getColor($this->setCounter) . "' ";
                    }
                }
            } else {
                if ($this->seriesType == 1 && (gettype(strpos($this->chartType, "pie")) == "boolean" && gettype(strpos($this->chartType, "line")) == "boolean" && gettype(strpos($this->chartType, "area")) == "boolean")) {
                    if (strpos(strtolower($strParam), " color") === false) {
                        $colorSet = " color='" . $this->getColor($this->setCounter) . "' ";
                    }
                }
            }
            # setting set parameter 
            $strSetXML = "<set  value='" . $value . "' " . $strParam . $colorSet . " />";
        } else {
            $strParam = $this->ConvertParamToXMLAttribute($strParam);

            # setting vline parameter
            $strSetXML = "<vLine " . $strParam . "  />";
        }
        return $strSetXML;
    }

    ## - - - -   - -   Array Init Functions  - - --- - -- - - - - - - -- - - - - -
    # Function createCategory create array element with in Categories

    function createCategory($catID) {
        $this->categoryNames[$catID] = array();
    }

    # createDataset dataset array element

    function createDataset($dataID) {
        $this->dataset[$dataID] = array();
    }

    # creating set  dataset array element

    function createDataValues($datasetID, $dataID) {
        $this->dataset[$datasetID][$dataID] = array();
    }

    # createTrendLines create TrendLines array

    function createTrendLines($lineID) {
        $this->trendLines[$lineID] = array();
    }

    # setTLine create TrendLine parameter 

    function setTLine($lineID, $paramName, $paramValue) {
        $this->trendLines[$lineID][$paramName] = $paramValue;
    }

    # ----- ----------    -----  Misc utility functions  ---- ------ -----------
    # converting ' and " to %26apos; and &quot; 

    function encodeSpecialChars($strValue) {

        $pattern = "/%(?![\da-f]{2}|[\da-f]{4})/i";
        $strValue = preg_replace($pattern, "%25", $strValue);

        if ($this->encodeChars == true) {
            $strValue = str_replace("&", "%26", $strValue);
            $strValue = str_replace("'", "%26apos;", $strValue);
            $strValue = str_replace("\"", "%26quot;", $strValue);

            $strValue = preg_replace("/\<a/i", "%26lt;A", $strValue);
            $strValue = preg_replace("/\<\/a/i", "%26lt;/A", $strValue);

            $strValue = preg_replace("/\<i/i", "%26lt;I", $strValue);
            $strValue = preg_replace("/\<\/i/i", "%26lt;/I", $strValue);

            $strValue = preg_replace("/\<u/i", "%26lt;U", $strValue);
            $strValue = preg_replace("/\<\/u/i", "%26lt;/U", $strValue);

            $strValue = preg_replace("/\<li/i", "%26lt;LI", $strValue);
            $strValue = preg_replace("/\<\/li/i", "%26lt;/LI", $strValue);

            $strValue = preg_replace("/\<font/i", "%26lt;FONT", $strValue);
            $strValue = preg_replace("/\<\/font/i", "%26lt;/FONT", $strValue);

            $strValue = preg_replace("/\<p/i", "%26lt;P", $strValue);
            $strValue = preg_replace("/\<\/p/i", "%26lt;/P", $strValue);

            $strValue = preg_replace("/\<br/i", "%26lt;BR", $strValue);

            $strValue = preg_replace("/\<b/i", "%26lt;B", $strValue);
            $strValue = preg_replace("/\<\/b/i", "%26lt;/B", $strValue);

            $strValue = str_replace("<", "%ab", $strValue);
            $strValue = str_replace(">", "%26gt;", $strValue);
        } else {
            $strValue = str_replace("'", "&apos;", $strValue);
            $strValue = str_replace("\"", "&quot;", $strValue);

            $strValue = preg_replace("/\<a/i", "&lt;A", $strValue);
            $strValue = preg_replace("/\<\/a/i", "&lt;/A", $strValue);

            $strValue = preg_replace("/\<i/i", "&lt;I", $strValue);
            $strValue = preg_replace("/\<\/i/i", "&lt;/I", $strValue);

            $strValue = preg_replace("/\<u/i", "&lt;U", $strValue);
            $strValue = preg_replace("/\<\/u/i", "&lt;/U", $strValue);

            $strValue = preg_replace("/\<li/i", "&lt;LI", $strValue);
            $strValue = preg_replace("/\<\/li/i", "&lt;/LI", $strValue);

            $strValue = preg_replace("/\<font/i", "&lt;FONT", $strValue);
            $strValue = preg_replace("/\<\/font/i", "&lt;/FONT", $strValue);

            $strValue = preg_replace("/\<p/i", "&lt;P", $strValue);
            $strValue = preg_replace("/\<\/p/i", "&lt;/P", $strValue);

            $strValue = preg_replace("/\<br/i", "&lt;BR", $strValue);

            $strValue = preg_replace("/\<b/i", "&lt;B", $strValue);
            $strValue = preg_replace("/\<\/b/i", "&lt;/B", $strValue);

            $strValue = str_replace("<", "%ab", $strValue);
            $strValue = str_replace(">", "&gt;", $strValue);
        }

        $strValue = str_replace("=", "%3d", $strValue);
        $strValue = str_replace("+", "%2b", $strValue);

        $strValue = str_replace("¢", "%a2", $strValue);
        $strValue = str_replace("£", "%a3", $strValue);
        $strValue = str_replace("€", "%E2%82%AC", $strValue);
        $strValue = str_replace("¥", "%a5", $strValue);
        $strValue = str_replace("₣", "%e2%82%a3", $strValue);

        return $strValue;
    }

    # Its convert pattern link to original link 
    # abcd.php?cid=##Field_name_1##&pname=##Field_name_2##

    function getLinkFromPattern($row, $tempLink) {
        # convert link into array break on '##'
        $aa = explode("##", $tempLink);
        # Reading array
        foreach ($aa as $v) {
            # Finding '=' into array
            $pos = strpos($v, "=");
            # not found '=' 
            if ($pos === false) {
                if ($v != "") {
                    $pet = "##" . $v . "##";
                    $tempLink = str_replace($pet, $row[$v], $tempLink);
                }
            }
        }
        return $tempLink;
    }

    # convertion of semi colon(;) separeted paramater to XML attribute

    function ConvertParamToXMLAttribute($strParam) {

        $xmlParam = "";
        $listArray = explode($this->del, $strParam);
        foreach ($listArray as $valueArray) {
            $paramValue = explode("=", $valueArray, 2);
            if ($this->validateParam($paramValue) == true) {
                # creating parameter set
                $xmlParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
            }
        }

        # Return
        return $xmlParam;
    }

    function validateParam($paramValue) {
        if (count($paramValue) >= 2) {
            if (trim($paramValue[0]) == "") {
                return false;
            }
            return true;
        } else {
            return false;
        }
    }

    # Getting Charts series type from charts array. 1 => single series, 2=> multi-series, 3=> scatter and bubble, 4=> MSStacked. defult 1 => single series

    function getSeriesType() {
        $sValue = 1;
        if (is_array($this->chartSWF[$this->chartType])) {
            $sValue = $this->chartSWF[$this->chartType][1];
        } else {
            $sValue = 1;
        }
        $this->seriesType = $sValue;
    }

    #this function returns a color from a list of colors

    function getColor($counter) {

        $strColor = "";
        if ($this->UserColorON == false) {
            $strColor = $this->arr_FCColors[$counter % count($this->arr_FCColors)];
        } else {
            $strColor = $this->UserColor[$counter % count($this->UserColor)];
        }

        return $strColor;
    }

    # Clear User Color 

    function ClearUserColor() {
        $this->UserColorON = false;
    }

    # add User Colors

    function addColors($ColorList) {
        $listArray = explode($this->del, $ColorList);
        $this->UserColorON = true;
        foreach ($listArray as $valueArray) {
            $this->UserColor[$this->userColorCounter] = $valueArray;
            $this->userColorCounter++;
        }
    }

    ### ----- Pupulate Color and Chart SWF array  ------ ------- ---------------------

    function colorInit() {
        $this->arr_FCColors[] = "AFD8F8";
        $this->arr_FCColors[] = "F6BD0F";
        $this->arr_FCColors[] = "8BBA00";
        $this->arr_FCColors[] = "FF8E46";
        $this->arr_FCColors[] = "008E8E";
        $this->arr_FCColors[] = "D64646";
        $this->arr_FCColors[] = "8E468E";
        $this->arr_FCColors[] = "588526";
        $this->arr_FCColors[] = "B3AA00";
        $this->arr_FCColors[] = "008ED6";
        $this->arr_FCColors[] = "9D080D";
        $this->arr_FCColors[] = "A186BE";
        $this->arr_FCColors[] = "CC6600";
        $this->arr_FCColors[] = "FDC689";
        $this->arr_FCColors[] = "ABA000";
        $this->arr_FCColors[] = "F26D7D";
        $this->arr_FCColors[] = "FFF200";
        $this->arr_FCColors[] = "0054A6";
        $this->arr_FCColors[] = "F7941C";
        $this->arr_FCColors[] = "CC3300";
        $this->arr_FCColors[] = "006600";
        $this->arr_FCColors[] = "663300";
        $this->arr_FCColors[] = "6DCFF6";
    }

    # Setting FusionCharts SWF file array list and series 

    function setChartArrays() {

        $this->chartSWF['area2d'][0] = "Area2D";
        $this->chartSWF['area2d'][1] = 1;
        $this->chartSWF['bar2d'][0] = "Bar2D";
        $this->chartSWF['bar2d'][1] = 1;
        $this->chartSWF['column2d'][0] = "Column2D";
        $this->chartSWF['column2d'][1] = 1;
        $this->chartSWF['column3d'][0] = "Column3D";
        $this->chartSWF['column3d'][1] = 1;
        $this->chartSWF['doughnut2d'][0] = "Doughnut2D";
        $this->chartSWF['doughnut2d'][1] = 1;
        $this->chartSWF['doughnut3d'][0] = "Doughnut3D";
        $this->chartSWF['doughnut3d'][1] = 1;
        $this->chartSWF['line'][0] = "Line";
        $this->chartSWF['line'][1] = 1;
        $this->chartSWF['pie2d'][0] = "Pie2D";
        $this->chartSWF['pie2d'][1] = 1;
        $this->chartSWF['pie3d'][0] = "Pie3D";
        $this->chartSWF['pie3d'][1] = 1;
        $this->chartSWF['funnel'][0] = "Funnel";
        $this->chartSWF['funnel'][1] = 1;

        $this->chartSWF['msarea'][0] = "MSArea";
        $this->chartSWF['msarea'][1] = 2;
        $this->chartSWF['msarea2d'][0] = "MSArea2D";
        $this->chartSWF['msarea2d'][1] = 2;
        $this->chartSWF['msbar2d'][0] = "MSBar2D";
        $this->chartSWF['msbar2d'][1] = 2;
        $this->chartSWF['mscolumn2d'][0] = "MSColumn2D";
        $this->chartSWF['mscolumn2d'][1] = 2;
        $this->chartSWF['mscolumn3d'][0] = "MSColumn3D";
        $this->chartSWF['mscolumn3d'][1] = 2;
        $this->chartSWF['mscolumn3dlinedy'][0] = "MSColumn3DLineDY";
        $this->chartSWF['mscolumn3dlinedy'][1] = 2;
        $this->chartSWF['mscolumnLine3D'][0] = "MSColumnLine3D";
        $this->chartSWF['mscolumnLine3D'][1] = 2;
        $this->chartSWF['mscombi2d'][0] = "MSCombi2D";
        $this->chartSWF['mscombi2d'][1] = 2;
        $this->chartSWF['mscombidy2d'][0] = "MSCombiDY2D";
        $this->chartSWF['mscombidy2d'][1] = 2;
        $this->chartSWF['msline'][0] = "MSLine";
        $this->chartSWF['msline'][1] = 2;
        $this->chartSWF['scrollarea2d'][0] = "ScrollArea2D";
        $this->chartSWF['scrollarea2d'][1] = 2;
        $this->chartSWF['scrollcolumn2d'][0] = "ScrollColumn2D";
        $this->chartSWF['scrollcolumn2d'][1] = 2;
        $this->chartSWF['scrollcombi2d'][0] = "ScrollCombi2D";
        $this->chartSWF['scrollcombi2d'][1] = 2;
        $this->chartSWF['scrollcombidy2d'][0] = "ScrollCombiDY2D";
        $this->chartSWF['scrollcombidy2d'][1] = 2;
        $this->chartSWF['scrollline2d'][0] = "ScrollLine2D";
        $this->chartSWF['scrollline2d'][1] = 2;
        $this->chartSWF['scrollstackedcolumn2d'][0] = "ScrollStackedColumn2D";
        $this->chartSWF['scrollstackedcolumn2d'][1] = 2;
        $this->chartSWF['stackedarea2d'][0] = "StackedArea2D";
        $this->chartSWF['stackedarea2d'][1] = 2;
        $this->chartSWF['stackedbar2d'][0] = "StackedBar2D";
        $this->chartSWF['stackedbar2d'][1] = 2;
        $this->chartSWF['stackedbar3d'][0] = "StackedBar3D";
        $this->chartSWF['stackedbar3d'][1] = 2;
        $this->chartSWF['stackedcolumn2d'][0] = "StackedColumn2D";
        $this->chartSWF['stackedcolumn2d'][1] = 2;
        $this->chartSWF['stackedcolumn3d'][0] = "StackedColumn3D";
        $this->chartSWF['stackedcolumn3d'][1] = 2;
        $this->chartSWF['stackedcolumn3dlinedy'][0] = "StackedColumn3DLineDY";
        $this->chartSWF['stackedcolumn3dlinedy'][1] = 2;
        $this->chartSWF['mscolumn2dlinedy'][0] = "MSColumn2DLineDY";
        $this->chartSWF['mscolumn2dlinedy'][1] = 2;


        $this->chartSWF['bubble'][0] = "Bubble";
        $this->chartSWF['bubble'][1] = 3;
        $this->chartSWF['scatter'][0] = "Scatter";
        $this->chartSWF['scatter'][1] = 3;

        $this->chartSWF['msstackedcolumn2dlinedy'][0] = "MSStackedColumn2DLineDY";
        $this->chartSWF['msstackedcolumn2dlinedy'][1] = 4;
        $this->chartSWF['msstackedcolumn2d'][0] = "MSStackedColumn2D";
        $this->chartSWF['msstackedcolumn2d'][1] = 2;

        $this->chartSWF['gantt'][0] = "Gantt";
        $this->chartSWF['gantt'][1] = 5;
    }

    ####################### GANTT CHART  (start) ######################################
    # ----------- Public Functions -----------------------------------------------
    # Function addCategory adding Category and vLine element

    function addGanttCategorySet($catParam="") {
        $this->GT_categories_Counter++;
        $this->GT_categories[$this->GT_categories_Counter] = array();
        $strParam = "";

        # cheking catParam not blank
        if ($catParam != "") {

            $strParam = $this->ConvertParamToXMLAttribute($catParam);
        }

        $this->GT_categoriesParam[$this->GT_categories_Counter] = $strParam;
    }

    # Function addGanttCategory adding Category 

    function addGanttCategory($label="", $catParam="") {

        $strCatXML = "";
        $strParam = "";

        # cheking catParam not blank
        if ($catParam != "") {
            $strParam = $this->ConvertParamToXMLAttribute($catParam);
        }
        # adding label and parameter set to category 
        $strCatXML = "<category name='" . $label . "' " . $strParam . " />";

        # storing into GT_categories array
        $this->GT_categories[$this->GT_categories_Counter][$this->GT_subcategories_Counter] = $strCatXML;
        # Increase Counter
        $this->GT_subcategories_Counter++;
    }

    # Setting Process Parameter into categoriesParam variables

    function setGanttProcessesParams($strParam) {

        $this->GT_processes_Param .= $this->ConvertParamToXMLAttribute($strParam);
    }

    # Function addGanttProcess adding Process

    function addGanttProcess($label="", $catParam="") {

        $strCatXML = "";
        $strParam = "";

        # cheking catParam not blank
        if ($catParam != "") {

            $strParam = $this->ConvertParamToXMLAttribute($catParam);
        }
        # adding label and parameter set to category 
        $strCatXML = "<process name='" . $label . "' " . $strParam . " />";

        # storing into categoryNames array
        $this->GT_processes[$this->GT_processes_Counter] = $strCatXML;
        # Increase Counter
        $this->GT_processes_Counter++;
    }

    # Setting Tasks Parameter into TaskParam variables

    function setGanttTasksParams($strParam) {

        $this->GT_Tasks_Param .= $this->ConvertParamToXMLAttribute($strParam);
    }

    # Function addGanttTasks adding Tasks

    function addGanttTask($label="", $catParam="") {

        $strCatXML = "";
        $strParam = "";

        # cheking catParam not blank
        if ($catParam != "") {

            $strParam = $this->ConvertParamToXMLAttribute($catParam);
        }
        # adding label and parameter set to category 
        $strCatXML = "<task name='" . $label . "' " . $strParam . " />";

        # storing into GT_Tasks array
        $this->GT_Tasks[$this->GT_Tasks_Counter] = $strCatXML;
        # Increase Counter
        $this->GT_Tasks_Counter++;
    }

    # Setting Tasks Parameter into ConnectorsParam variables

    function setGanttConnectorsParams($strParam) {
        $this->GT_Connectors_Param .= $this->ConvertParamToXMLAttribute($strParam);
    }

    # Function addGanttConnector adding Connector

    function addGanttConnector($From, $To, $catParam="") {

        $strCatXML = "";
        $strParam = "";

        # cheking catParam not blank
        if ($catParam != "") {
            $strParam = $this->ConvertParamToXMLAttribute($catParam);
        }
        # adding label and parameter set to category 
        $strCatXML = "<connector fromTaskId='" . $From . "'  toTaskId='" . $To . "' " . $strParam . " />";

        # storing into GT_Connectors array
        $this->GT_Connectors[$this->GT_Connectors_Counter] = $strCatXML;
        # Increase Counter
        $this->GT_Connectors_Counter++;
    }

    # Setting Milestones Parameter into MilestonesParam variables

    function setGanttMilestonesParams($strParam) {
        $this->GT_Milestones_Param .= $this->ConvertParamToXMLAttribute($strParam);
    }

    # Function addGanttMilestones adding Milestones

    function addGanttMilestone($taskID, $catParam="") {

        $strCatXML = "";
        $strParam = "";

        # cheking catParam not blank
        if ($catParam != "") {
            $strParam = $this->ConvertParamToXMLAttribute($catParam);
        }
        # adding label and parameter set to Milestones
        $strCatXML = "<milestone taskId='" . $taskID . "'  " . $strParam . " />";

        # storing into GT_Milestones array
        $this->GT_Milestones[$this->GT_Milestones_Counter] = $strCatXML;
        # Increase Counter
        $this->GT_Milestones_Counter++;
    }

    # Setting Legend Parameter into LegendParam variables

    function setGanttLegendParams($strParam) {

        $this->GT_legend_Param .= $this->ConvertParamToXMLAttribute($strParam);
    }

    # Function addGanttLegendItem adding LegendItem

    function addGanttLegendItem($label, $catParam="") {

        $strCatXML = "";
        $strParam = "";

        # cheking catParam not blank
        if ($catParam != "") {

            $strParam = $this->ConvertParamToXMLAttribute($catParam);
        }
        # adding label and parameter set to LegendItem
        $strCatXML = "<item label='" . $label . "'  " . $strParam . " />";

        # storing into GT_legend array
        $this->GT_legend[$this->GT_legend_Counter] = $strCatXML;
        # Increase Counter
        $this->GT_legend_Counter++;
    }

    # Setting Datatable Parameter into DatatableParam variables

    function setGanttDatatableParams($strParam) {

        $this->GT_datatableParam .= $this->ConvertParamToXMLAttribute($strParam);
    }

    # Function addGanttDatacolumn adding Datacolumn

    function addGanttDatacolumn($catParam="") {
        $this->GT_datatable_Counter++;
        $this->GT_datatable[$this->GT_datatable_Counter] = array();
        $strParam = "";

        # cheking catParam not blank
        if ($catParam != "") {
            $strParam = $this->ConvertParamToXMLAttribute($catParam);
        }

        $this->GT_dataColumnParam[$this->GT_datatable_Counter] = $strParam;
    }

    # Function addGanttColumnText adding ColumnText

    function addGanttColumnText($label="", $catParam="") {

        $strCatXML = "";
        $strParam = "";

        # cheking catParam not blank
        if ($catParam != "") {
            $strParam = $this->ConvertParamToXMLAttribute($catParam);
        }
        # adding label and parameter set to category 
        $strCatXML = "<text label='" . $label . "' " . $strParam . " />";

        # storing into GT_datatable array
        $this->GT_datatable[$this->GT_datatable_Counter][$this->GT_subdatatable_Counter] = $strCatXML;
        # Increase Counter
        $this->GT_subdatatable_Counter++;
    }

    ### ------------- Gantt Private Functoins ----------------------------------------------------------------------
    #-- Gantt array init ------------------------------------------------
    # Function createCategory create array element with in Categories

    function createGanttCategory($catID) {
        $this->GT_categories[$catID] = array();
    }

    # Function createGanttDatatable create array element with in Datatable

    function createGanttDatatable($catID) {
        $this->GT_datatable[$catID] = array();
    }

    #-- GANTT XML genetators -------------------------------------------
    # Function getCategoriesXML for getting Category part XML

    function getGanttCategoriesXML() {
        $partXML = "";
        foreach ($this->GT_categories as $part_type => $part_name) {
            # adding categories parameter
            $partXML .="<categories " . $this->GT_categoriesParam[$part_type] . " >";
            foreach ($this->GT_categories[$part_type] as $part_type1 => $part_name1) {
                if ($part_name1 != "") {
                    # adding elements 
                    $partXML .= $part_name1;
                }
            }
            # Closing <categories>
            $partXML .="</categories>";
        }

        return $partXML;
    }

    # Function getProcessesXML for getting Processes part XML

    function getProcessesXML() {

        $partXML = "";
        # adding processes parameter
        $partXML = "<processes " . $this->GT_processes_Param . " >";
        foreach ($this->GT_processes as $part_type => $part_name) {
            if ($part_name != "") {
                # adding elements 

                $partXML .= $part_name;
            }
        }

        # Closing <categories>
        $partXML .="</processes>";
        return $partXML;
    }

    # Function getProcessesXML for getting Processes part XML

    function getTasksXML() {

        $partXML = "";
        # adding processes parameter
        $partXML = "<tasks " . $this->GT_Tasks_Param . " >";
        foreach ($this->GT_Tasks as $part_type => $part_name) {
            if ($part_name != "") {
                # adding elements 

                $partXML .= $part_name;
            }
        }

        # Closing <tasks>
        $partXML .="</tasks>";
        return $partXML;
    }

    # Function getConnectorsXML for getting Connectors part XML

    function getConnectorsXML() {
        $c = 0;
        $partXML = "";
        # adding connectors parameter
        $partXML = "<connectors " . $this->GT_Connectors_Param . " >";
        foreach ($this->GT_Connectors as $part_type => $part_name) {
            if ($part_name != "") {
                # adding elements 

                $partXML .= $part_name;
                $c++;
            }
        }

        # Closing <connectors>
        $partXML .="</connectors>";
        if ($c > 0) {
            return $partXML;
        } else {
            return "";
        }
    }

    # Function getMilestonesXML for getting Milestones part XML

    function getMilestonesXML() {
        $c = 0;
        $partXML = "";
        # adding Milestones parameter
        $partXML = "<milestones " . $this->GT_Milestones_Param . " >";
        foreach ($this->GT_Milestones as $part_type => $part_name) {
            if ($part_name != "") {
                # adding elements 
                $partXML .= $part_name;
                $c++;
            }
        }

        # Closing <milestones>
        $partXML .="</milestones>";
        if ($c > 0) {
            return $partXML;
        } else {
            return "";
        }
    }

    # Function getLegendXML for getting Legend part XML

    function getLegendXML() {
        $c = 0;
        $partXML = "";
        # adding Legend parameter
        $partXML = "<legend " . $this->GT_legend_Param . " >";
        foreach ($this->GT_legend as $part_type => $part_name) {
            if ($part_name != "") {
                # adding elements 
                $partXML .= $part_name;
                $c++;
            }
        }

        # Closing <milestones>
        $partXML .="</legend>";
        if ($c > 0) {
            return $partXML;
        } else {
            return "";
        }
    }

    # Function getGanttDatatableXML for getting Category part XML

    function getGanttDatatableXML() {
        $partXML = "";
        foreach ($this->GT_datatable as $part_type => $part_name) {
            # adding dataColumn parameter
            $partXML .="<dataColumn " . $this->GT_dataColumnParam[$part_type] . " >";
            foreach ($this->GT_datatable[$part_type] as $part_type1 => $part_name1) {
                if ($part_name1 != "") {
                    # adding elements 
                    $partXML .= $part_name1;
                }
            }
            # Closing <dataColumn>
            $partXML .="</dataColumn>";
        }
        $allPart = "<dataTable " . $this->GT_datatableParam . " >" . $partXML . "</dataTable>";
        return $allPart;
    }

    ####################### GANTT CHART  (end) ######################################
    #====================== For Future Use (start) =====================================
    ##---------PUBLIC functions ----------------------------------------------------
    # adding Lineset array and parameter to it

    function addLineset($seriesName, $strParam) {
        $this->createLineset();
        $this->lineSetCounter++;
        $this->lineSet[$this->lineCounter][$this->lineSetCounter] = array();

        $tempParam = "";
        $tempParam = "seriesName='" . $seriesName . "' ";

        $tempParam .= $this->ConvertParamToXMLAttribute($strParam);

        $this->lineIDCounter++;
        # setting lineSetParam array with Parameter set	
        $this->lineSetParam [$this->lineSetCounter] = $tempParam;
    }

    # adding Line's Set data 

    function addLinesetData($value="", $setParam="", $vlineParam = "") {
        $strSetXML = "";
        # getting parameter set  
        $strSetXML = $this->setSSMSDataArray($value, $setParam, $vlineParam);

        # setting paramter to lineSet array
        $this->lineSet[$this->lineCounter][$this->lineSetCounter][$this->lineIDCounter] = $strSetXML;

        # Increase lineIDCounter
        $this->lineIDCounter++;
    }

    # adding ms dataset and parameter	 

    function addMSSSubDataset($seriesName, $strParam) {
        $this->MSSSubDatasetCounter++;
        $this->MSSDataset[$this->MSSDatasetCounter][$this->MSSSubDatasetCounter] = array();

        $tempParam = "";
        # creating seriesName
        $tempParam = "seriesName='" . $seriesName . "' ";
        $tempParam .= $this->ConvertParamToXMLAttribute($strParam);

        $this->MSSSetCounter++;

        # adding Parameter to MSSDatasetParams array
        $this->MSSDatasetParams[$this->MSSDatasetCounter][$this->MSSSubDatasetCounter] = $tempParam;
    }

    # adding set element to dataset element for seriesType 3

    function setScatterBubbleDataArray($value="", $setParam="", $vlineParam = "") {
        $strSetXML = "";
        $strParam = "";
        if ($vlineParam == "") {
            if ($setParam != "") {
                $strParam = $this->ConvertParamToXMLAttribute($setParam);
            }
            # adding Parameter into set elements
            $strSetXML = "<set  x='" . $value . "' " . $strParam . " />";
        } else {
            # Parameter for vLine
            $strParam = $this->ConvertParamToXMLAttribute($vlineParam);

            # adding vLine element
            $strSetXML = "<vLine " . $strParam . "  />";
        }
        return $strSetXML;
    }

    # setvTLine create TrendLine parameter 

    function setVTrendLines($strParam) {
        $listArray = explode($this->del, $strParam);
        foreach ($listArray as $valueArray) {
            $paramValue = explode("=", $valueArray, 2);
            if ($this->validateParam($paramValue) == true) {
                $this->vtrendLines[$this->vtLineCounter][$paramValue[0]] = $this->encodeSpecialChars($paramValue[1]);
            }
        }
        $this->vtLineCounter++;
    }

    # setSubStylesParam create sub styles array to store parameters

    function addStyleDef($styleName, $styleType, $strParam) {
        $this->styles["definition"]["style"][$this->styleDefCounter]["name"] = $styleName;
        $this->styles["definition"]["style"][$this->styleDefCounter]["type"] = $styleType;

        $listArray = explode($this->del, $strParam);
        foreach ($listArray as $valueArray) {
            $paramValue = explode("=", $valueArray, 2);
            if ($this->validateParam($paramValue) == true) {
                $this->styles["definition"]["style"][$this->styleDefCounter][$paramValue[0]] = $this->encodeSpecialChars($paramValue[1]);
            }
        }
        $this->styleDefCounter++;
    }

    # apply styles

    function addStyleApp($toObject, $styles) {
        $this->styles["application"]["apply"][$this->styleAppCounter]["toObject"] = $toObject;
        $this->styles["application"]["apply"][$this->styleAppCounter]["styles"] = $styles;

        $this->styleAppCounter++;
    }

    ##---------PRIVATE functions ----------------------------------------------------
    ## - --  - - XML generators  - - - - ---- - -- - - - -
    # Function getLinesetXML for getting Lineset XML

    function getLinesetXML() {
        # if seriesType MSStackedColumn2DLineDY (4) then linset element will be Generate
        if ($this->seriesType == 4) {
            $partXML = "";
            # Fetching lineSet array and Generating lineset xml element
            foreach ($this->lineSet as $part_type => $part_name) {
                $partXML .= "<lineset " . $this->lineSetParam[$part_type] . " >";
                foreach ($this->lineSet[$part_type] as $part_type1 => $part_name1) {
                    foreach ($this->lineSet[$part_type][$part_type1] as $part_type2 => $part_name2) {
                        if ($part_type2 != "") {
                            $partXML .= $part_name2;
                        }
                    }
                }
                $partXML .= "</lineset>";
            }
            return $partXML;
        }
    }

    # Function getMSStackedDatasetXML for getting datset part XML from ms stacked chart dataset array
    # <dataset>
    #     <dataset seriesName='Product A' color='AFD8F8' showValues='0'>
    #       <set value='30' />
    #       <set value='26' />
    #     </dataset>
    # </dataset>

    function getMSStackedDatasetXML() {
        if ($this->seriesType == 4) {
            $partXML = "";

            foreach ($this->MSSDataset as $part_type => $part_name) {
                $partXML .= "<dataset>";
                foreach ($this->MSSDataset[$part_type] as $part_type1 => $part_name1) {
                    $partXML .= "<dataset " . $this->MSSDatasetParams[$part_type][$part_type1] . " >";
                    foreach ($this->MSSDataset[$part_type][$part_type1] as $part_type2 => $part_name2) {
                        if ($part_type2 != "") {
                            $partXML .= $part_name2;
                        }
                    }
                    $partXML .= "</dataset>";
                }
                $partXML .= "</dataset>";
            }

            return $partXML;
        }
    }

    # getvTrendLinesXML create XML output depending on trendLines array
    #  <vTrendlines>
    #    <line displayValue='vTrendLines' startValue='5' endValue='6' alpha='10' color='ff0000'  />
    # </vTrendlines>

    function getvTrendLinesXML() {
        $partXML = "";
        $lineXML = "";
        # fetching vtrendLines array
        foreach ($this->vtrendLines as $l_type => $l_name) {
            # staring line element
            $lineXML .="<line ";
            # fetching vtrendLines array with in array element
            foreach ($this->vtrendLines[$l_type] as $part_type => $part_name) {
                $lineXML .= $part_type . "='" . $this->encodeSpecialChars($part_name) . "' ";
            }
            # close line element
            $lineXML .=" />";
        }
        # if line element present then adding $lineXML with in vtrendLines element 
        $pos = strpos($lineXML, "=");
        if ($pos !== false) {
            $partXML = "<vTrendlines>" . $lineXML . "</vTrendlines>";
        } else {
            # return nothing
            $partXML = "";
        }
        # return vtrendLines xml
        return $partXML;
    }

    # getStylesXML create the styles XML from styles array
    /*
      <styles>
      <definition>
      <style name='CanvasAnim' type='animation' param='_xScale' start='0' duration='1' />
      </definition>
      <application>
      <apply toObject='Canvas' styles='CanvasAnim' />
      </application>
      </styles>
     */

    function getStylesXML() {
        $partXML = "";
        $lineXML = "";
        # fetching styles array	
        foreach ($this->styles as $s_type => $s_name) {
            $lineXML .="<" . $s_type . ">";
            # fetching styles array with in array	
            foreach ($this->styles[$s_type] as $sub_type => $sub_name) {
                # creating dynamic element depend on array name
                # fetching styles array with in array	with array element 
                foreach ($this->styles[$s_type][$sub_type] as $part_type => $part_name) {
                    $lineXML .="<" . $sub_type . " ";
                    foreach ($this->styles[$s_type][$sub_type][$part_type] as $part_type1 => $part_name1) {

                        # adding elements parameter
                        $lineXML .= $part_type1 . "='" . $this->encodeSpecialChars($part_name1) . "' ";
                    }
                    $lineXML .=" />";
                }
            }
            # closing open eleement
            $lineXML .="</" . $s_type . ">";
        }
        # adding $lineXML  with in style element
        # cheking element have any attribute or not
        $pos = strpos($lineXML, "=");
        if ($pos !== false) {
            $partXML = "<styles>" . $lineXML . "</styles>";
        } else {
            $partXML = "";
        }
        # returning the part of xml
        return $partXML;
    }

    ## ---------- Array Init functions ----------------------------------------------
    # create Lineset array 

    function createLineset() {
        $this->lineCounter++;
        $this->lineSet[$this->lineCounter] = array();
    }

    # creating MS-Stacked ataset array element and parameter array

    function createMSSDataset() {
        $this->MSSDatasetCounter++;
        $this->MSSDataset[$this->MSSDatasetCounter] = array();
        $this->MSSDatasetParams[$this->MSSDatasetCounter] = array();
    }

    # Creating set data with in datset

    function createMSSSetData() {
        $this->MSSSetCounter++;
        $this->MSSDataset[$this->MSSDatasetCounter][$this->MSSSubDatasetCounter][$this->MSSSetCounter] = array();
    }

    # createStyles create array element with in styles array

    function createStyles($styleID) {
        $this->styles[$styleID] = array();
    }

    # createSubStyles create array element with in styles array element with in sub styles array 
    # element for storing sub element parameter

    function createSubStyles($styleID, $subStyle) {
        $this->styles[$styleID][$subStyle] = array();
    }

    # createvTrendLines create TrendLines array

    function createvTrendLines($lineID) {
        $this->vtrendLines[$lineID] = array();
    }

    # setvTLine create TrendLine parameter 

    function setvTLine($lineID, $paramName, $paramValue) {
        $this->vtrendLines[$lineID][$paramName] = $paramValue;
    }

    # create sub styles param

    function createSubStylesParam($styleID, $subStyle, $subParam) {
        $this->styles[$styleID][$subStyle][$subParam] = array();
    }

    # setSubStylesParam create sub styles array to store parameters

    function setSubStylesParam($styleID, $subStyle, $subParam, $id, $value) {
        $this->styles[$styleID][$subStyle][$subParam][$id] = $value;
    }

#====================== For Future Use (end) ======================================
}
?>
